package com.cax.common.utils;

import java.math.BigDecimal;
import java.util.Objects;

/**
 * @Description:计算处理类
 * @author: liangjian
 * @created: 2020年10月20日17:43:38
 */
public class NumberUtils {

    private NumberUtils(){

    }

    /**
     * 数字去掉小数点后多余的0
     * 0转0
     * 0.0转0
     * 1.0转1
     * 1.01转1.01
     */
    public static String away(String s){
        if(StringUtils.isBlank(s)||!s.contains(".")){
            return s;
        }
        //去掉多余的0
        s = s.replaceAll("0+?$", "");
        //如最后一位是.则去掉
        s = s.replaceAll("[.]$", "");
        return s;
    }

    /**
     * 保留指定位数的小数 不进行四舍五入 并可以指定是否去掉多余的0
     * obj 操作的数据 接受String Double BigDecimal
     * num 保留指定的小数个数
     * away 是否去掉多余的0 例如0.0为0 1.0为1 1.10为1.0
     */
    public static String  numberHandle(Object obj,int num,boolean away){
        if(null==obj){
            return null;
        }

        try {
            BigDecimal decimal= new BigDecimal(obj.toString());
            BigDecimal newPrice= decimal.setScale(num, BigDecimal.ROUND_DOWN);

            String str = "";
            if(away){
                str = NumberUtils.away(newPrice.toString());
            }else{
                str = newPrice.toString();
            }
            return str;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return obj.toString();
    }

    /**
     * 保留指定位数的小数 不进行四舍五入 并可以指定是否去掉多余的0
     * obj 操作的数据 接受String Double BigDecimal
     * num 保留指定的小数个数
     * away 是否去掉多余的0 例如0.0为0 1.0为1 1.10为1.0
     */
    public static BigDecimal toBigDecimal(Object obj,int num,boolean away){

        if(null==obj){
            return BigDecimal.ZERO;
        }

        try {
            BigDecimal bigDecimal= new BigDecimal(StringUtils.toStr(obj));
            BigDecimal bigDecimalNew = bigDecimal.setScale(num, BigDecimal.ROUND_DOWN);

            if(!away){
                return bigDecimalNew;
            }
            return new BigDecimal(NumberUtils.away(StringUtils.toStr(bigDecimalNew)));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 同比 环比 计算 返回BigDecimal
     * current 当前值 只能接受 String BigDecimal Double Integer int
     * last 上期值 只能接受 String BigDecimal Double Integer int
     * num 保留的小数个数 不进行四舍五入 传null默认保留2位
     */
    public static BigDecimal contrastToBigdecimal(Object current, Object last,Integer num) {

        //(现在的-以前的)/以前的 以前的没有是不会进行计算的 意思就是分母不能为0
        if(null==current || null==last || "0".equals(NumberUtils.away(last.toString()))){
            return null;
        }

        //转为BigDecimal
        BigDecimal currentBg = new BigDecimal(current.toString());
        BigDecimal lastBg = new BigDecimal(last.toString());

        //减
        BigDecimal reduce = currentBg.subtract(lastBg);
        //除
        if(null==num){
            //默认保留两位
            num = 2;
        }
        //舍入模式说明 https://blog.csdn.net/LX2016341134/article/details/124476059
        BigDecimal divide = reduce.divide(lastBg,num,BigDecimal.ROUND_DOWN);
        //乘法
        BigDecimal multiply = divide.multiply(new BigDecimal(100));

        return multiply;
    }

    /**
     * 同比 环比 计算 返回Double
     * current 当前值 只能接受 String BigDecimal Double Integer int
     * last 上期值 只能接受 String BigDecimal Double Integer int
     */
    public static Double contrast(Object current, Object last) {
        BigDecimal result = contrastToBigdecimal(current, last,null);
        if(null==result){
            return null;
        }
        return result.doubleValue();
    }

    /**
     * BigDecimal判断大于 小于 等于0
     * 返回 等于0-持平unchanged 大于0-上升up 小于0-下降down
     */
    public static String compareToZero(BigDecimal bigDecimal) {
        if(Objects.isNull(bigDecimal)){
            return null;
        }
        //上升up 下降down 持平unchanged
        if(bigDecimal.compareTo(BigDecimal.ZERO) == 0){
            //等于0
            return "unchanged";
        }else if(bigDecimal.compareTo(BigDecimal.ZERO) == 1){
            //大于0
            return "up";
        }else{
            //小于0
            return "down";
        }
    }

    /**
     * 得分 同比 环比 计算
     * current 当前值 只能接受 String BigDecimal Double Integer int
     * Object 上期值 只能接受 String BigDecimal Double Integer int
     */
    public static Double reduce(Object current, Object last) {

        //现在的-以前的
        if(null==current||null==last||"0".equals(NumberUtils.away(last.toString()))){
            return null;
        }
        //转为BigDecimal
        BigDecimal currentBg = new BigDecimal(current.toString());
        BigDecimal lastBg = new BigDecimal(last.toString());

        //减
        BigDecimal reduce = currentBg.subtract(lastBg);

        return reduce.doubleValue();
    }

    /**
     * 占比 计算
     * current 当前值 只能接受 String BigDecimal Double Integer int
     * sum 总数 只能接受 String BigDecimal Double Integer int
     * num 保留的小数个数 不进行四舍五入 传null默认保留2位
     */
    public static BigDecimal scale(Object current,Object sum,Integer num) {

        //现在的/总数
        if(null==current || null==sum || "0".equals(NumberUtils.away(StringUtils.toStr(sum)))){
            return null;
        }
        //转为BigDecimal
        BigDecimal currentBg = new BigDecimal(StringUtils.toStr(current));
        BigDecimal sumBg = new BigDecimal(StringUtils.toStr(sum));

        //除
        if(null==num){
            //默认保留两位
            num = 2;
        }
        BigDecimal divide = currentBg.divide(sumBg,num,BigDecimal.ROUND_DOWN);
        //乘法
        BigDecimal multiply = divide.multiply(new BigDecimal(100));

        return multiply;
    }

    /**
     * 占比 计算【如果是0返回0】
     * current 当前值 只能接受 String BigDecimal Double Integer int
     * sum 总数 只能接受 String BigDecimal Double Integer int
     * num 保留的小数个数 不进行四舍五入 传null默认保留2位
     */
    public static BigDecimal scaleIsZero(Object current,Object sum,Integer num) {

        //现在的/总数
        if(null==current || null==sum || "0".equals(NumberUtils.away(StringUtils.toStr(sum)))){
            return BigDecimal.ZERO;
        }
        //转为BigDecimal
        BigDecimal currentBg = new BigDecimal(StringUtils.toStr(current));
        BigDecimal sumBg = new BigDecimal(StringUtils.toStr(sum));

        //除
        if(null==num){
            //默认保留两位
            num = 2;
        }
        BigDecimal divide = currentBg.divide(sumBg,num,BigDecimal.ROUND_DOWN);
        //乘法
        BigDecimal multiply = divide.multiply(new BigDecimal(100));

        return multiply;
    }

    /**
     * 加法
     * num1 数字1 只能接受 String BigDecimal Double Integer int
     * num2 数字2 只能接受 String BigDecimal Double Integer int
     */
    public static BigDecimal add(Object num1, Object num2) {
        if(null==num1||null==num2){
            return null;
        }
        //转为BigDecimal
        BigDecimal num1Bg = new BigDecimal(num1.toString());
        BigDecimal num2Bg = new BigDecimal(num2.toString());

        return num1Bg.add(num2Bg);
    }

    /**
     * 减法
     * bySubtractNum 被减数 只能接受 String BigDecimal Double Integer int
     * subtractNum 减数 只能接受 String BigDecimal Double Integer int
     */
    public static BigDecimal subtract(Object bySubtractNum, Object subtractNum) {

        if(null==bySubtractNum||null==subtractNum){
            return null;
        }

        //转为BigDecimal
        BigDecimal bySubtractNumBg = new BigDecimal(bySubtractNum.toString());
        BigDecimal subtractNumBg = new BigDecimal(subtractNum.toString());

        //减
        return bySubtractNumBg.subtract(subtractNumBg);
    }

    /**
     * 乘法
     * num1 数字1 只能接受 String BigDecimal Double Integer int
     * num2 数字2 只能接受 String BigDecimal Double Integer int
     */
    public static BigDecimal multiply(Object num1, Object num2) {
        if(null==num1||null==num2){
            return null;
        }

        //转为BigDecimal
        BigDecimal b1 = new BigDecimal(StringUtils.toStr(num1));
        BigDecimal b2 = new BigDecimal(StringUtils.toStr(num2));

        //b1乘b2
        BigDecimal divide = b1.multiply(b2);

        return divide;
    }

    /**
     * 除法
     * num1 数字1 只能接受 String BigDecimal Double Integer int
     * num2 数字2 只能接受 String BigDecimal Double Integer int
     * num 保留的小数个数 不进行四舍五入 传null默认保留2位
     */
    public static BigDecimal divide(Object num1, Object num2,Integer num) {
        if(null==num1||null==num2){
            return null;
        }

        //转为BigDecimal
        BigDecimal b1 = new BigDecimal(StringUtils.toStr(num1));
        BigDecimal b2 = new BigDecimal(StringUtils.toStr(num2));

        //除
        if(null==num){
            //默认保留两位
            num = 2;
        }
        //b1除b2
        BigDecimal divide = b1.divide(b2,num,BigDecimal.ROUND_DOWN);

        return divide;
    }

    /**
     * Long的空判断 不为null 同时不能为0
     * true表示空 false表示不为空
     */
    public static boolean longEmpty(Long par) {
        if(Objects.isNull(par)||par.equals(0L)||par.equals(0L)){
            return true;
        }
        return false;
    }

    /**
     * Integer的空判断 不为null 同时不能为0
     * true表示空 false表示不为空
     */
    public static boolean integerEmpty(Integer par) {
        if(Objects.isNull(par)||par.equals(0)){
            return true;
        }
        return false;
    }

}
